package com.smart.community.commons.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 文件信息工具类
 * 用于处理JSON格式的文件信息，按照《用户上传文件功能使用指南.md》规范
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 */
@Slf4j
public class FileInfoUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 文件信息DTO
     */
    public static class FileInfoDTO {
        private String id;
        private String fileName;
        private String fileUrl;
        private Long fileSize;
        private String uploadType;
        private String uploadSource;
        private String status;
        private String createTime;
        private String fileType;
        private String fileExtension;
        private String fileMd5;
        private String originalFileName;
        private String filePath;

        // Getters and Setters
        public String getId() { return id; }
        public void setId(String id) { this.id = id; }
        
        public String getFileName() { return fileName; }
        public void setFileName(String fileName) { this.fileName = fileName; }
        
        public String getFileUrl() { return fileUrl; }
        public void setFileUrl(String fileUrl) { this.fileUrl = fileUrl; }
        
        public Long getFileSize() { return fileSize; }
        public void setFileSize(Long fileSize) { this.fileSize = fileSize; }
        
        public String getUploadType() { return uploadType; }
        public void setUploadType(String uploadType) { this.uploadType = uploadType; }
        
        public String getUploadSource() { return uploadSource; }
        public void setUploadSource(String uploadSource) { this.uploadSource = uploadSource; }
        
        public String getStatus() { return status; }
        public void setStatus(String status) { this.status = status; }
        
        public String getCreateTime() { return createTime; }
        public void setCreateTime(String createTime) { this.createTime = createTime; }
        
        public String getFileType() { return fileType; }
        public void setFileType(String fileType) { this.fileType = fileType; }
        
        public String getFileExtension() { return fileExtension; }
        public void setFileExtension(String fileExtension) { this.fileExtension = fileExtension; }
        
        public String getFileMd5() { return fileMd5; }
        public void setFileMd5(String fileMd5) { this.fileMd5 = fileMd5; }
        
        public String getOriginalFileName() { return originalFileName; }
        public void setOriginalFileName(String originalFileName) { this.originalFileName = originalFileName; }
        
        public String getFilePath() { return filePath; }
        public void setFilePath(String filePath) { this.filePath = filePath; }
    }

    /**
     * 将文件信息列表转换为JSON字符串
     * 
     * @param fileInfoList 文件信息列表
     * @return JSON字符串
     */
    public static String toJsonString(List<FileInfoDTO> fileInfoList) {
        if (fileInfoList == null || fileInfoList.isEmpty()) {
            return null;
        }
        
        try {
            return objectMapper.writeValueAsString(fileInfoList);
        } catch (JsonProcessingException e) {
            log.error("转换文件信息列表为JSON字符串失败", e);
            return null;
        }
    }

    /**
     * 从JSON字符串解析文件信息列表
     * 
     * @param jsonString JSON字符串
     * @return 文件信息列表
     */
    public static List<FileInfoDTO> fromJsonString(String jsonString) {
        if (StringUtils.isEmpty(jsonString)) {
            return new ArrayList<>();
        }
        
        try {
            return objectMapper.readValue(jsonString, new TypeReference<List<FileInfoDTO>>() {});
        } catch (JsonProcessingException e) {
            log.error("解析JSON字符串为文件信息列表失败: {}", jsonString, e);
            return new ArrayList<>();
        }
    }

    /**
     * 获取第一个文件的URL（兼容旧数据）
     * 
     * @param jsonString JSON字符串
     * @return 第一个文件的URL，如果没有则返回null
     */
    public static String getFirstFileUrlFromJson(String jsonString) {
        List<FileInfoDTO> fileInfoList = fromJsonString(jsonString);
        if (fileInfoList.isEmpty()) {
            return null;
        }
        return fileInfoList.get(0).getFileUrl();
    }

    /**
     * 获取文件数量
     * 
     * @param jsonString JSON字符串
     * @return 文件数量
     */
    public static int getFileCount(String jsonString) {
        List<FileInfoDTO> fileInfoList = fromJsonString(jsonString);
        return fileInfoList.size();
    }

    /**
     * 添加文件到JSON字符串
     * 
     * @param jsonString 原JSON字符串
     * @param newFileInfo 新文件信息
     * @return 更新后的JSON字符串
     */
    public static String addFileToJson(String jsonString, FileInfoDTO newFileInfo) {
        List<FileInfoDTO> fileInfoList = fromJsonString(jsonString);
        fileInfoList.add(newFileInfo);
        return toJsonString(fileInfoList);
    }

    /**
     * 从JSON字符串中删除文件
     * 
     * @param jsonString 原JSON字符串
     * @param fileId 要删除的文件ID
     * @return 更新后的JSON字符串
     */
    public static String removeFileFromJson(String jsonString, String fileId) {
        List<FileInfoDTO> fileInfoList = fromJsonString(jsonString);
        fileInfoList.removeIf(file -> fileId.equals(file.getId()));
        return toJsonString(fileInfoList);
    }

    /**
     * 验证JSON字符串是否为有效的文件信息格式
     * 
     * @param jsonString JSON字符串
     * @return 是否有效
     */
    public static boolean isValidFileInfoJson(String jsonString) {
        if (StringUtils.isEmpty(jsonString)) {
            return false;
        }
        
        try {
            List<FileInfoDTO> fileInfoList = fromJsonString(jsonString);
            return !fileInfoList.isEmpty();
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取所有文件的URL列表
     * 
     * @param jsonString JSON字符串
     * @return URL列表
     */
    public static List<String> getAllFileUrls(String jsonString) {
        List<FileInfoDTO> fileInfoList = fromJsonString(jsonString);
        List<String> urls = new ArrayList<>();
        for (FileInfoDTO fileInfo : fileInfoList) {
            if (StringUtils.isNotEmpty(fileInfo.getFileUrl())) {
                urls.add(fileInfo.getFileUrl());
            }
        }
        return urls;
    }

    /**
     * 获取所有文件的URL字符串（逗号分隔）
     * 
     * @param jsonString JSON字符串
     * @return 逗号分隔的URL字符串
     */
    public static String getAllFileUrlsString(String jsonString) {
        List<String> urls = getAllFileUrls(jsonString);
        return String.join(",", urls);
    }

    /**
     * 创建文件信息DTO
     * 
     * @param id 文件ID
     * @param fileName 文件名
     * @param fileUrl 文件URL
     * @param fileSize 文件大小
     * @param uploadType 上传类型
     * @param uploadSource 上传来源
     * @return 文件信息DTO
     */
    public static FileInfoDTO createFileInfo(String id, String fileName, String fileUrl, 
                                           Long fileSize, String uploadType, String uploadSource) {
        FileInfoDTO fileInfo = new FileInfoDTO();
        fileInfo.setId(id);
        fileInfo.setFileName(fileName);
        fileInfo.setFileUrl(fileUrl);
        fileInfo.setFileSize(fileSize);
        fileInfo.setUploadType(uploadType);
        fileInfo.setUploadSource(uploadSource);
        fileInfo.setStatus("success");
        fileInfo.setCreateTime(java.time.LocalDateTime.now().toString());
        
        // 从文件名提取扩展名
        if (StringUtils.isNotEmpty(fileName) && fileName.contains(".")) {
            String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
            fileInfo.setFileExtension(extension);
            fileInfo.setFileType("image/" + extension.toLowerCase());
        }
        
        fileInfo.setOriginalFileName(fileName);
        fileInfo.setFilePath(fileUrl);
        
        return fileInfo;
    }
}
